package com.hilinos.common.entity;

import com.fasterxml.jackson.annotation.JsonIgnore;
import com.hilinos.common.common.ReturnCode;
import com.hilinos.common.util.AssertUtils;
import com.hilinos.common.util.EncryptUtils;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.springframework.util.ObjectUtils;

@Data
@Builder
@AllArgsConstructor
@NoArgsConstructor
public class SignVo {

    /**
     * 平台id
     */
    private String appid;
    /**
     * 随机字符串，最大24位
     */
    private String nonce;
    /**
     * 秒时间戳
     */
    private Long timestamp;

    /**
     * 用户id
     * 如果是连接ws的用户，则还需要设置用户id
     */
    private String accountId;

    /**
     * 生成的认证标签字符串
     * 生成方式 sign=MD5大写(accountId + appid + nonce + timestamp + secret)
     * 其中，appid和secret需要向平台申请获取
     * 如果accountId为空，则不参与sign生成
     */
    private String sign;

    @JsonIgnore
    public String genSign(String secret) {
        AssertUtils.isNotEmpty(secret, ReturnCode.DATA_NOT_EXIST.respMsg("secret不存在"));
        checkGenParams();
        return EncryptUtils
                .getMd5((ObjectUtils.isEmpty(accountId) ? "" : accountId) + appid + nonce + timestamp + secret);
    }

    /**
     * 验证生成签名的参数是否合法
     */
    @JsonIgnore
    public void checkGenParams() {
        AssertUtils.isNotEmpty(appid, ReturnCode.DATA_NOT_EXIST.respMsg("appid不能为空"));
        AssertUtils.isNotEmpty(nonce, ReturnCode.DATA_NOT_EXIST.respMsg("nonce不能为空"));
        AssertUtils.isRex(nonce.length() <= 24, ReturnCode.NORMAL_PARAM_TYPE_ERROR.respMsg("nonce长度不合法，长度不大于24"));
        AssertUtils.isNotEmpty(timestamp, ReturnCode.DATA_NOT_EXIST.respMsg("timestamp不能为空"));
    }

    @JsonIgnore
    public boolean checkSign(String secret) {
        String genSign = genSign(secret);
        return genSign.equals(sign);
    }

}